package userfunctions;

import java.io.IOException;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import userfunctions.packets.*;

/**
 * Klasa zapewniająca obsługe polaczenia. Klasa zbudowana jest jako singleton,
 * w celu uzywania tylko 1 polaczenia przez wszystkie obiekty.
 * @author Kamil Woźnicki i Michał Krajewski
 */
class NetworkManager {

    private String sessionKey = null;

    /**
     * Konstruktor zapewniajacy, ze nie zostanie stworzone wiecej instancji obiektu.
     */
    protected NetworkManager() {
    }

    private static class SingletonHolder {

        private final static NetworkManager instance = new NetworkManager();
    }
    
    server_client.Client socket = new server_client.Client();

    /**
     * Metoda zwracajaca jedyna instancje obiektu w calym programie.
     * @return Instancja obiektu NetworkManager.
     */
    public static NetworkManager getInstance() {
        return SingletonHolder.instance;
    }
    boolean connected = false;

    /**
     * Metoda wysylajac pakiet do serwera.
     * @param packet 
     * @return Wartosc logiczna okreslajaca poprawnosc operacji.
     */
    public boolean sendPacket(IPacket packet) {
        if (!connected) {
            socket.connect("localhost", 7171);
        }

        packet.setTime(new Date());
        packet.setSessionKey(sessionKey);
        
        try {
            socket.send(packet);
        } catch (IOException ex) {
            Logger.getLogger(NetworkManager.class.getName()).log(Level.SEVERE, null, ex);
        }

        return true;
    }

    /**
     * Metoda zwracajaca pakiet przeslany przez serwer.
     * @return Pakiet zawierajacy dane przeslane przez serwer.
     */
    public IPacket receivePacket() {
        Object object = socket.getFromQueue();
	
        if (object instanceof IPacket) {
            return (IPacket)object;
        }
        
        return null;
    }
}
